#ifndef SERVER_H_
#define SERVER_H_

#include "../lib/Process.h"
#include "../lib/MessageQueue.h"
#include "../lib/SIGTERM_Handler.h"

#include "../shared/Request.h"

#include "DataBase.h"

class Server: public Process {

private:

	MessageQueue<Message> 	channel;	/* canal de comunicacion entre cliente y servidor */

	DataBase	 db;			/* database */

	SIGTERM_Handler sigTerm;	/* handler de señal de cierre del server */

	int  my_pid;					/* process id del servidor */
	bool is_channel_open;		/* false si hay que abrir la cola de mensajes */

	bool isRunning();

	/* abre la cola de mensajes si está cerrada */
	void openChannel();

	/**
	 * Espera una request de un cliente
	 * returns: un registro con la request obtenida. En caso de error devuelve null
	 */
	void waitForRequest(Message* req);

	/**
	 * Procesa una request de un cliente. Si la request es invalida no hace nada
	 */
	void processRequest(Message* req);

	/* Busca el registro en la base de datos y se lo envia al cliente */
	void processGet(Message* request);

	/* Inserta el registro en la base de datos y envia el rdo al cliente */
	void processInsert(Message* request);

	/* Modifica el registro en la base de datos y envia el rdo al cliente */
	void processUpdate(Message* request);

	/* Remueve el registro en la base de datos y envia el rdo al cliente */
	void processRemove(Message* request);

	/* Envia un codigo de error al cliente */
	void processError(Message* request);


	/* Devuelve true si inicio correctamente, false en otro caso */
	bool init();

	void finalize();

public:

	Server();

	virtual ~Server();

	/**
	 * Implementa la lógica del servidor
	 */
	virtual int run();

	/**
	 * Detiene el servidor.
	 */
	void stopServer();
};

#endif /* SERVER_H_ */
